{
 "cells": [
  {
   "cell_type": "code",
   "execution_count": 1,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "#本文使用svd（）函数实现数据降维\n",
    "#导入数据集合\n",
    "import numpy as np\n",
    "\n",
    "def load_data(filename,splitstyle = \"\\t\"):\n",
    "    dataset = []\n",
    "    file = open(filename)\n",
    "    for line in file.readlines():\n",
    "        lineArr = line.strip().split(splitstyle)\n",
    "        m = len(lineArr)\n",
    "        dataset.append(lineArr[0:m])\n",
    "    return np.array(dataset,dtype=np.float64)\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "(1000L, 2L)\n"
     ]
    },
    {
     "data": {
      "image/png": "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\nTkSuQmCC\n",
      "text/plain": [
       "<matplotlib.figure.Figure at 0x5ec1780>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "x = load_data(\"svd/testSet.txt\")\n",
    "print x.shape\n",
    "\n",
    "import matplotlib.pyplot as plt\n",
    "#可视化一下数据集合\n",
    "plt.scatter(x[:,0],x[:,1],marker='x',color = 'r')\n",
    "plt.xlabel('x0')\n",
    "plt.ylabel('x1')\n",
    "plt.show()\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "metadata": {},
   "outputs": [],
   "source": [
    "#feature normalize 特征归一化\n",
    "def featureNormalize(X):\n",
    "    X_norm = X\n",
    "    mu = np.zeros((1,X.shape[1]))\n",
    "    sigma = np.zeros((1,X.shape[1]))\n",
    "    \n",
    "    mu = np.mean(X,axis=0) #mean value of every feature\n",
    "    sigma = np.std(X,axis=0)#std of every feature\n",
    "    X_norm = (X - mu) / sigma\n",
    "    \n",
    "    return X_norm,mu,sigma \n",
    "\n",
    "def SVD(x_norm,k):\n",
    "    m = x_norm.shape[0]\n",
    "    x_cov = np.cov(x_norm,rowvar=0)  #[n*n]\n",
    "    u,s,v = np.linalg.svd(x_cov)     #奇异值分解，s是从大到小排序的对角矩阵，代表奇异值，类似于\n",
    "                                      #pca中得到的矩阵的特征值，代表数据集合中重要的特征\n",
    "    u_reduce = u[:,:k] #[n,k]\n",
    "    x_reduce = x_norm.dot(u_reduce) #[m,n]*[n,k]=[m,k]\n",
    "    x_recover = x_reduce.dot(u_reduce.T) #[m,k]*[k,n]=[m,n]\n",
    "    \n",
    "    return x_reduce,x_recover,s\n",
    "    "
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "(1000L, 1L) (1000L, 2L)\n"
     ]
    }
   ],
   "source": [
    "x_norm,x_mean,x_var = featureNormalize(x)\n",
    "x_reduce,x_recover,s = SVD(x_norm,k=1)\n",
    "\n",
    "print x_reduce.shape,x_recover.shape"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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\nAAAAAElFTkSuQmCC\n",
      "text/plain": [
       "<matplotlib.figure.Figure at 0x7c3b198>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "#注意到哦，这里显示的是原来数据标准化x_norm之后的图,以及标准化转变的x_recover\n",
    "plt.scatter(x_norm[:,0],x_norm[:,1],color = \"red\",marker = \"^\")\n",
    "plt.scatter(x_recover[:,0],x_recover[:,1],color=\"blue\",marker=\"o\")\n",
    "plt.xlabel(\"x0\")\n",
    "plt.ylabel(\"x1\")\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "(7L, 7L) (5L,) (5L, 5L)\n[  9.72140007e+00   5.29397912e+00   6.84226362e-01   1.18665567e-15\n   3.51083347e-16]\n"
     ]
    }
   ],
   "source": [
    "#我们现在看一下svd()函数的作用:奇异值分解\n",
    "\n",
    "a = np.array([[1,1,1,0,0],\n",
    "              [2,2,2,0,0],\n",
    "              [1,1,1,0,0],\n",
    "              [5,5,5,0,0],\n",
    "              [1,1,0,2,2],\n",
    "              [0,0,0,3,3],\n",
    "              [0,0,0,1,1]])\n",
    "U,S,V = np.linalg.svd(a)\n",
    "\n",
    "print U.shape,S.shape,V.shape\n",
    "print S\n",
    "#在数学公式上，U=[m*m] S=[m*n] V=[n*n]   data = U * S * V\n",
    "#因为S是对角矩阵，只显示对角元素，所以numpy显示为1维\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "[  6.19213014e+01   3.37204594e+01   4.35823919e+00   7.55850629e-15\n   2.23625585e-15]\n"
     ]
    },
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<matplotlib.figure.Figure at 0x7cf68d0>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "#我们看到前面三个的奇异值相对于后面的两个，数量级相差很大，表明主成分为前3个\n",
    "#现在通过S的值，判断准则————保留数据中90%的信息\n",
    "total = np.sum(S)\n",
    "s_rate = S / total * 100\n",
    "num = S.shape[0]\n",
    "print s_rate\n",
    "plt.plot(np.arange(1,num+1,1),s_rate,\"-o\")\n",
    "plt.xlabel(\"Principal Component Number\")\n",
    "plt.ylabel(\"Percentage of Singular value\")\n",
    "plt.show()\n",
    "\n",
    "\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 8,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "[0.0, 61.921301416650664, 95.641760811955351, 99.999999999999986, 100.0]\n"
     ]
    },
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<matplotlib.figure.Figure at 0x816d4a8>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "#看一下主成分的累积和\n",
    "print [np.sum(s_rate[:i]) for i in xrange(num)]\n",
    "plt.plot(np.arange(1,num+1,1),[np.sum(s_rate[:i]) for i in xrange(num)],\"-o\")\n",
    "plt.xlabel(\"Principal Component Number\")\n",
    "plt.ylabel(\"sum of Percentage of Singular value\")\n",
    "\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 9,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "[[ 9.72140007  0.          0.        ]\n [ 0.          5.29397912  0.        ]\n [ 0.          0.          0.68422636]]\n[[1 1 1 0 0]\n [2 2 2 0 0]\n [1 1 1 0 0]\n [4 5 4 0 0]\n [1 1 0 2 2]\n [0 0 0 3 3]\n [0 0 0 1 1]]\na is equal to A: [[ True  True  True  True  True]\n [ True  True  True  True  True]\n [ True  True  True  True  True]\n [False  True False  True  True]\n [ True  True  True  True  True]\n [ True  True  True  True  True]\n [ True  True  True  True  True]]\n"
     ]
    }
   ],
   "source": [
    "#我们之后需要s的前3个元素，就能保留矩阵的信息\n",
    "\n",
    "s3 = np.eye(3) * S[:3]\n",
    "print s3\n",
    "\n",
    "A = U[:,:3].dot(s3).dot(V[:3,:])\n",
    "print A.astype(int)\n",
    "print \"a is equal to A:\",A.astype(int)==a"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 10,
   "metadata": {},
   "outputs": [],
   "source": [
    "def printMat(inMat, thresh=0.8):\n",
    "    for i in range(32):\n",
    "        for k in range(32):\n",
    "            if float(inMat[i,k]) > thresh:\n",
    "                print 1,\n",
    "            else: print 0,\n",
    "        print ''\n",
    "\n",
    "def imgCompress(numSV=3, thresh=0.8):\n",
    "    myl = []\n",
    "    for line in open('svd/0_5.txt').readlines():\n",
    "        newRow = []\n",
    "        for i in range(32):\n",
    "            newRow.append(int(line[i]))\n",
    "        myl.append(newRow)\n",
    "    myMat = np.mat(myl)\n",
    "    print \"****original matrix******\"\n",
    "    printMat(myMat, thresh)\n",
    "    U,Sigma,VT = np.linalg.svd(myMat) #奇异值分解\n",
    "    SigRecon = np.mat(np.zeros((numSV, numSV)))\n",
    "    for k in range(numSV):#construct diagonal matrix from vector\n",
    "        SigRecon[k,k] = Sigma[k]\n",
    "    reconMat = U[:,:numSV]*SigRecon*VT[:numSV,:] #重构,只要numSV维\n",
    "    print \"****reconstructed matrix using %d singular values******\" % numSV\n",
    "    printMat(reconMat, thresh)\n",
    "    \n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 11,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "****original matrix******\n0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 \n0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 \n0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 \n0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 \n0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 \n0 0 0 0 0 0 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 0 0 0 0 0 0 0 0 \n0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 0 0 0 0 0 0 0 \n0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 0 0 0 0 1 1 1 1 1 0 0 0 0 0 0 0 0 \n0 0 0 0 0 0 0 1 1 1 1 1 1 1 0 0 0 0 0 1 1 1 1 1 0 0 0 0 0 0 0 0 \n0 0 0 0 0 0 1 1 1 1 1 1 0 0 0 0 0 0 0 0 1 1 1 1 0 0 0 0 0 0 0 0 \n0 0 0 0 0 0 1 1 1 1 1 1 0 0 0 0 0 0 0 0 1 1 1 1 1 0 0 0 0 0 0 0 \n0 0 0 0 0 0 1 1 1 1 1 1 0 0 0 0 0 0 0 0 0 1 1 1 1 0 0 0 0 0 0 0 \n0 0 0 0 0 0 1 1 1 1 1 "
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "1 0 0 0 0 0 0 0 0 0 1 1 1 1 0 0 0 0 0 0 0 \n0 0 0 0 0 0 0 1 1 1 1 1 1 0 0 0 0 0 0 0 0 0 1 1 1 1 0 0 0 0 0 0 \n0 0 0 0 0 0 1 1 1 1 1 1 1 0 0 0 0 0 0 0 0 0 1 1 1 1 0 0 0 0 0 0 \n0 0 0 0 0 0 1 1 1 1 1 1 0 0 0 0 0 0 0 0 0 0 1 1 1 1 0 0 0 0 0 0 \n0 0 0 0 0 0 0 1 1 1 1 1 0 0 0 0 0 0 0 0 0 0 1 1 1 1 0 0 0 0 0 0 \n0 0 0 0 0 0 1 1 1 1 1 1 0 0 0 0 0 0 0 0 0 0 1 1 1 1 0 0 0 0 0 0 \n0 0 0 0 0 0 0 1 1 1 1 1 0 0 0 0 0 0 0 0 0 0 1 1 1 1 0 0 0 0 0 0 \n0 0 0 0 0 0 0 1 1 1 1 1 0 0 0 0 0 0 0 0 0 1 1 1 1 1 0 0 0 0 0 0 \n0 0 0 0 0 0 0 0 1 1 1 1 1 0 0 0 0 0 0 0 0 0 1 1 1 1 1 0 0 0 0 0 \n0 0 0 0 0 0 0 0 1 1 1 1 1 0 0 0 0 0 0 0 0 0 1 1 1 1 1 0 0 0 0 0 \n0 0 0 0 0 0 0 0 1 1 1 1 1 0 0 0 0 0 0 0 0 0 1 1 1 1 1 0 0 0 0 0 \n0 0 0 0 0 0 0 0 1 1 1 1 1 0 0 0 0 0 0 0 0 1 1 1 1 1 0 0 0 0 0 0 \n0 0 0 0 0 0 0 0 1 1 1 1 1 0 0 0 0 0 0 0 1 1 1 1 1 1 0 0 0 0 0 0 \n0 0 0 0 0 0 0 0 1 1 1 1 1 1 0 0 0 0 0 1 1 1 1 1 1 0 0 0 0 0 0 0 \n0 0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 0 0 0 0 0 \n0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 0 0 0 0 0 \n0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 0 0 0 0 0 \n0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 1 1 1 1 1 0 0 0 0 0 0 0 0 0 \n0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 1 1 1 0 0 0 0 0 0 0 0 0 0 \n0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 \n****reconstructed matrix using 2 singular values******\n0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 \n0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 \n0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 \n0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 \n0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 \n0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 1 1 1 1 1 0 0 0 0 0 0 0 0 0 0 \n0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 1 1 1 1 1 0 0 0 0 0 0 0 0 0 0 \n0 0 0 0 0 0 0 0 0 1 1 1 1 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 \n0 0 0 0 0 0 0 0 1 1 1 1 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 \n0 0 0 0 0 0 0 0 1 1 1 1 0 0 0 0 0 0 0 0 0 0 1 1 1 0 0 0 0 0 0 0 \n0 0 0 0 0 0 0 0 1 1 1 1 0 0 0 0 0 0 0 0 0 0 1 1 1 0 0 0 0 0 0 0 \n0 0 0 0 0 0 0 0 1 1 1 1 0 0 0 0 0 0 0 0 0 0 1 1 1 0 0 0 0 0 0 0 \n0 0 0 0 0 0 0 0 1 1 1 1 0 0 0 0 0 0 0 0 0 0 1 1 1 0 0 0 0 0 0 0 \n0 0 0 0 0 0 0 0 1 1 1 1 0 0 0 0 0 0 0 0 0 0 1 1 1 0 0 0 0 0 0 0 \n0 0 0 0 0 0 0 0 1 1 1 1 0 0 0 0 0 0 0 0 0 0 1 1 1 0 0 0 0 0 0 0 \n0 0 0 0 0 0 0 0 1 1 1 1 0 0 0 0 0 0 0 0 0 0 1 1 1 0 0 0 0 0 0 0 \n0 0 0 0 0 0 0 0 1 1 1 1 0 0 "
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "0 0 0 0 0 0 0 0 1 1 1 0 0 0 0 0 0 0 \n0 0 0 0 0 0 0 0 1 1 1 1 0 0 0 0 0 0 0 0 0 0 1 1 1 0 0 0 0 0 0 0 \n0 0 0 0 0 0 0 0 1 1 1 1 0 0 0 0 0 0 0 0 0 0 1 1 1 0 0 0 0 0 0 0 \n0 0 0 0 0 0 0 0 1 1 1 1 0 0 0 0 0 0 0 0 0 0 1 1 1 0 0 0 0 0 0 0 \n0 0 0 0 0 0 0 0 1 1 1 1 0 0 0 0 0 0 0 0 0 0 1 1 1 0 0 0 0 0 0 0 \n0 0 0 0 0 0 0 0 1 1 1 1 0 0 0 0 0 0 0 0 0 0 1 1 1 0 0 0 0 0 0 0 \n0 0 0 0 0 0 0 0 1 1 1 1 0 0 0 0 0 0 0 0 0 0 1 1 1 0 0 0 0 0 0 0 \n0 0 0 0 0 0 0 0 1 1 1 1 0 0 0 0 0 0 0 0 0 0 1 1 1 0 0 0 0 0 0 0 \n0 0 0 0 0 0 0 0 1 1 1 1 0 0 0 0 0 0 0 0 0 0 1 1 1 0 0 0 0 0 0 0 \n0 0 0 0 0 0 0 0 1 1 1 1 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 \n0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 0 0 0 0 0 0 0 \n0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 1 1 1 1 1 0 0 0 0 0 0 0 0 0 0 \n0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 1 1 1 1 1 0 0 0 0 0 0 0 0 0 0 \n0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 \n0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 \n0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 \n"
     ]
    }
   ],
   "source": [
    "imgCompress(2)\n",
    "#前后效果一样，但是空间减少\n",
    "#从原来的需要myMat = 32*32的数组空间\n",
    "#到reconMat = U(32*2) + Sigma(2) + VT(2*32)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": []
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 2",
   "language": "python",
   "name": "python2"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 2
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython2",
   "version": "2.7.6"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 0
}
